#include "app_pool.h"
#include "log.h"
#include "pthread.h"
#include "mqueue.h"
#include "errno.h"


static mqd_t mq_fd;
static pthread_t pthreads[THREAD_NUM];


/**
 * 线程处理函数
 */
void *thread_func(void *arg)
{
    //持续的从队列中取出任务进行处理
    log_info("thread_func start");
    while(1)
    {   Task task;
        ssize_t ret= mq_receive(mq_fd, (char *)&task, sizeof(Task), 0);
        if (ret <0)
        {
            perror("mq_receive");
        }
        task.task_func(task.arg);
    }
}


/**
 * @brief  初始化线程池
 * 
 */int app_pool_init()
{   
    // 0  把历史队列删除 重新创建
    mq_unlink(QUEUE_FILE_NAME);

    // 声明 队列的属性结构体
    struct mq_attr attr;
    attr.mq_maxmsg = QUEUE_LENGTH;
    attr.mq_msgsize = sizeof(Task);//

    //初始化消息队列
    mq_fd=  mq_open(QUEUE_FILE_NAME,O_RDWR|O_CREAT,0666,&attr); 
    if(mq_fd == -1)
    {
        perror("mq_open");
        return -1;
    }

    //创建线程池 
    for (size_t i = 0; i < THREAD_NUM; i++)
    {
        pthread_create(&pthreads[i],NULL,thread_func,NULL);
    }
    return 0;
}

/**
 * @brief  销毁线程池
 */
int app_pool_destroy()
{
    mq_close(mq_fd);
    mq_unlink(QUEUE_FILE_NAME);
}

/**
 * @brief  提交任务
 */
int app_pool_submit_task(void *(*task_func)(void *) , void *arg )
{
    //1 要把外部g传过来的n方法和参数，g封装为结构体
    Task task ={
        .task_func=task_func,
        .arg=arg
    };
    //2 把结构体放到消息队列中
     int ret= mq_send(mq_fd, (char *)&task, sizeof(Task), 0);
     if (ret == -1)
     {
        perror("mq_send");
     }
     return ret;
     
}
